package smallfrench.moteur.interp.err;

import java.util.ArrayList;
import java.util.List;

public class IntercepteurErreurs {

	private final List<IntercepteurErreur> intercepteurs;

	public IntercepteurErreurs() {
		intercepteurs = new ArrayList<IntercepteurErreur>();
	}

	/**
	 * Attention, les intercepteurs doivent être ajoutés dans le bon ordre,
	 * du plus spécialisé au plus générique.
	 * @param i
	 */
	public void ajouter(IntercepteurErreur i) {
		intercepteurs.add(i);
	}

	/**
	 * 
	 * @param c
	 * @return L'intercepteur
	 */
	public IntercepteurErreur obtenir(Class<?> c) {

		for (IntercepteurErreur i : intercepteurs) {
			if (i.peutIntercepter(c))
				return i;
		}

		throw new IllegalArgumentException(
				"Aucun intercepteur pour la classe " + c);
	}

	public boolean peutIntercepter(Class<?> c) {
		for (IntercepteurErreur i : intercepteurs) {
			if (i.peutIntercepter(c))
				return true;
		}
		return false;
	}

	/**
	 * Vérifie que l'intercepteur peut intercepter la classe passée en
	 * paramètre. Sinon, lève une {@link IllegalArgumentException}.
	 * @param c
	 */
	public void verifierInterception(Class<?> c) {
		if (! peutIntercepter(c))
			throw new IllegalArgumentException("L'intercepteur ne peut pas "
					+ "intercepter les erreurs de classe " + c);
	}
}
